package com.semac.client.paginas.perfil;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.semac.client.aplicacao.AplicacaoController;
import com.semac.client.aplicacao.Pagina;
import com.semac.client.aplicacao.PaginasController;
import com.semac.client.rpc.PessoaRPCServices;
import com.semac.client.rpc.PessoaRPCServicesAsync;
import com.semac.shared.model.Pessoa;

public class PerfilUI extends Composite implements Pagina{
	
	
	private PessoaRPCServicesAsync servicoPessoas = PessoaRPCServices.Util.getInstance();
	
	private Pessoa pessoaLogada = AplicacaoController.getPessoaLogada();

	private static PerfilUIUiBinder uiBinder = GWT.create(PerfilUIUiBinder.class);
	@UiField TextBox editNome;
	@UiField TextBox editMatricula;
	@UiField PasswordTextBox editSenhaAtual;
	@UiField PasswordTextBox editSenhaNova;
	@UiField Button btnConfirmar;
	@UiField Label notEditEmail;

	interface PerfilUIUiBinder extends UiBinder<Widget, PerfilUI> {
	}

	public PerfilUI() {
		initWidget(uiBinder.createAndBindUi(this));
		this.notEditEmail.setText(this.pessoaLogada.getEmail());
		this.editMatricula.setValue(this.pessoaLogada.getCartaoUfrgs().toString());
		this.editNome.setValue(this.pessoaLogada.getNome());
	}
	
	@UiHandler("btnConfirmar")
	void onButtonClick(ClickEvent event) {
		
		if (!validaCampos()) return;
		
		pessoaLogada.setCartaoUfrgs(Integer.parseInt(this.editMatricula.getText()));
		pessoaLogada.setNome(this.editNome.getText());
		
		if (!this.editSenhaNova.getText().equals(""))
			pessoaLogada.setSenha(this.editSenhaNova.getText());
		
		servicoPessoas.updatePessoa(pessoaLogada, new AsyncCallback<Integer>() {			
			@Override
			public void onSuccess(Integer result) {
				Window.alert("Alterações realizadas com êxito!");
				//refresh na página para atualizar dados
				AplicacaoController.getInstance().refresh();				
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());							
			}
		});
	}

	@Override
	public String getValorHistoryToken() {
		return PaginasController.PERFIL;
	}
	
	@Override
	public Widget getView() {
		return this;
	}
	
	private boolean validaCampos(){
		
		String nome, senhaAtual, senhaNova;
		
		nome = this.editNome.getText().trim();
		senhaAtual = this.editSenhaAtual.getText().trim();
		senhaNova = this.editSenhaNova.getText().trim();
		
		// valida nomes
		if (nome.equals("")){
			Window.alert("Por favor insira um nome válido.");
			this.editNome.setFocus(true);
			return false;
		} 
			
		// valida senhas
		if (!senhaAtual.equals("")){
			if (senhaAtual.equals(this.pessoaLogada.getSenha())){
				if (senhaNova.length() < 6){
					Window.alert("Por favor insira uma senha válida, de no mínimo 6 dígitos.");
					this.editSenhaNova.setFocus(true);
					return false;
				}
			}else{
				Window.alert("A senha digitada não confere com a sua senha atual!");
				this.editSenhaAtual.setFocus(true);
				return false;				
			}			
		}else if (!senhaNova.equals("")){
			Window.alert("Se deseja alterar sua senha, preencha sua senha atual!");
			this.editSenhaAtual.setFocus(true);
			return false;
		}
		
		// valida cartao UFRGS
		try{
			Integer.parseInt(this.editMatricula.getText());
		}catch (Exception e) {
			Window.alert("Isto não é um valor válido para o cartão.");
			this.editMatricula.setFocus(true);
			return false;
		}		
		
		return true;
	}
}
